1. The Field of the Invention
The present invention relates to customizing binary content files. More specifically, the present invention relates to systems, methods, and computer program products for updating values of variables in a binary content file without recompiling source code associated with the binary content file.
2. Background and Relevant Art
A computing device typically includes software programs that are executed to cause the computing device to behave in certain ways. Software programs often include one or more modules that cooperatively interact to perform the various functions associated with the software program. Each module may include one or more computer-executable instructions, that when executed in combination, cause a particular module function to be performed. Combinations of computer-executable instructions may result in complex software programs that control the operation of a computing device, as well as, simple programs, which display a single character of text. One or more related modules of computer-executable instructions are often included in a single file.
Conventionally, there are two well-known methods used for generating computer-executable instructions, namely “compiling” and “interpreting.” To generate computer-executable instructions through compiling, a software module called a “compiler” receives “source code” and translates the source code into a binary content file. Binary content files often include instructions in the form of machine language, which is easily understandable by computing devices. Unfortunately, machine language consists entirely of numbers and is difficult, if not impossible, for humans to understand. As a result, most programmers utilize high-level programming languages such as BASIC or C++ to generate source code.
Compiling source code into a binary content file includes at least two basic processes and, depending on the computing device, programming language, and operating system, may include considerably more than two processes. The first basic process is translating source code into “object code.” Different compiler modules may be designed to operate with different types of source code and translate the source code into object code. Object code is often very similar to machine language. However, one difference is that object code often includes symbolic addresses that are not directly understandable by a computing device. The second basic process, often called “linking,” gives real values to all symbolic addresses thereby producing a binary content file that includes machine language.
As mentioned above, in addition to compiling, another method for generating computer-executable instructions is interpreting. In this lesser-used method, a computing device utilizes an interpreter for directly executing source code drafted in accordance with a high-level programming language. In essence, the machine language computer-executable instructions are generated and executed as the interpreter reads each line of source code.
Compiling and interpreting each have advantages and disadvantages. Binary content files generally require less storage space and run faster than interpreted programs. However, even minor changes to the source code associated with a binary content file may require completely recompiling an entire program. If the program is quite large, this may become time-consuming. On the other hand, modifications to interpreted high-level source code are automatically incorporated the next time the high-level source code is interpreted. However, execution of source code using an interpreter make take considerably more time that the execution of pre-compiled binary content.
Commercial software programs are almost solely distributed as binary content files due to the increased speed of execution, storage efficiency, and the lack of any requirement for an interpreter. Often, versions of a software program are developed and maintained for a wide variety of computing device platforms. Platforms may vary based on the hardware configuration of a computing device, how the hardware configuration should operate, or a written language that will be used with a computing device.
One type of binary content file is an image file that may be burned or flashed into a Read Only Memory (“ROM”) chip. Often included in such image files are “boot instructions” that cause a computing device to be brought into an operational state (or “booted”) when the computing device is powered on or reset. ROM chips are typically used to store boot instructions since the boot instructions will persist in memory when a computing device is powered down. The booting process is highly dependent on proper execution of the boot instructions, which are typically configured to operate with specific components included in a computing device.
Many similar computing devices require only minor variations to their boot instructions in order to boot properly. However, since image files are binary content files, separate versions of source code are typically maintained for each variation. It may also be desirable to configure the same computing device to boot differently in different operating environments. Separate versions of source code may be maintained for each distinct operating environment. For example, different source code may exist for an English language operating system as compared to a Japanese language operating system even though each operating system will run on the same computing device.
Additionally, if customization for a particular computing device is desired, different versions of binary content files need to be compiled for each different set of customizations. The workload associated with maintaining different versions of source code may substantially increase as the number of similar, yet different computing devices, configurations, and customizations increases. The problem is significantly compounded by the fact that a change to a configuration or customization must often be propagated to all modules that might be executed on the computing device. For example, a simple change in the configuration of system memory may need to be propagated to all modules that use system memory. If the change affects multiple languages, computing devices, and configuration settings, the amount of source code that must be edited and recompiled may be significant.
Maintaining large quantities of source code consumes the time resources and technical expertise of programmers. Additionally, since the large quantities of source code must often be recompiled, compiler resources may be used inefficiently. Consumption of programming resources and inefficient use of compiler resources both increase the cost associated with distributing a software program.
FIG. 1 illustrates some of the functional components that may be used in prior art methods for generating different versions of binary content files using a compiler. As shown, there are a number of versions of customized source code. Each version of customized source code performs substantially the same function and yet has minor variations from each of the other versions. Each version of customized source code corresponds to a customized binary content file. For example, customized source code 101A, 101B and 101C correspond to customized binary content files 103A, 103B and 103C, respectively. The three periods between each version of customized source code and customized binary content files represent that other versions (not shown) may exist. A software program may have numerous versions of customized source code and associated binary content files. Each version of customized source code must be compiled by a compiler such as compiler 102 to generate a corresponding customized binary content file.
One solution to the problem of increased maintenance requirements has been to compile a series of modules that may be interchanged in various ways to produce different behaviors. For example, a software program may include a plurality of language modules that are configured to display text in a variety of written languages. When the software program ships to a particular country, the language module associated with the country may be included in the software program.
While interchanging modules is beneficial, there are often still customizations that cannot be realized without recompiling. This is in part due to the level of granularity associated with interchanging functionality at the module level. For example, if new technology enables a mobile computing device to include additional system memory, an associated image file may need to be recompiled to make the mobile computing device compatible with the additional memory. The module may need to be recompiled because at the time the software program was developed, the new technology did not exist. Recompilation of an entire software program may be required even though a relatively small number of variables need to be changed to make the computing device compatible with the additional memory. This results in an inefficient use of compiler resources.
Therefore, what are desired are systems, methods, and computer program products for efficiently modifying binary content files without recompiling source code associated with the binary content file. What is further desired are systems, methods, and computer program products for modifying binary content files with increased granularity.